package com.example.productservice.model;

import javax.persistence.*;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

/**
 * 商品实体类
 * 用于存储商品的基本信息，包括名称、描述、价格、库存等
 * 
 * @author SimpleShop
 * @version 1.0
 */
@Entity
@Table(name = "products")  // 指定数据库表名
public class Product {

    /**
     * 商品ID，主键，自增
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 商品名称，不能为空
     */
    @NotBlank(message = "商品名称不能为空")
    @Column(nullable = false) // 商品名称不能为空
    private String name;

    /**
     * 商品描述，使用TEXT类型存储长文本
     */
    @Column(columnDefinition = "TEXT") // 使用TEXT类型存储长文本
    private String description;

    /**
     * 商品价格，必须大于0，精度为10位整数2位小数
     */
    @NotNull(message = "价格不能为空")
    @DecimalMin(value = "0.01", message = "价格必须大于0")
    @Column(nullable = false, precision = 10, scale = 2) // 价格精度：10位，小数2位
    private BigDecimal price;

    /**
     * 商品库存数量，不能为空
     */
    @NotNull(message = "库存不能为空")
    @Column(nullable = false)
    private Integer stock; // 商品库存

    /**
     * 商品分类，多对一关系
     */
    @ManyToOne
    @JoinColumn(name = "category_id") // 关联分类表的外键
    private Category category;

    // 默认构造函数（JPA要求）
    public Product() {}

    // 带参数的构造函数（方便测试）
    public Product(String name, String description, BigDecimal price, Integer stock) {
        this.name = name;
        this.description = description;
        this.price = price;
        this.stock = stock;
    }

    // Getter和Setter方法
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }
}